package de.htw.ejb.transaktionen.kundenverwaltung.schnittstelle;

/**
 * Klasse fuer die Kundenverwaltung
 * 
 * @author Torsten Mansfeld
 */
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.interceptor.Interceptors;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import de.htw.ejb.manager.EntityManagementDienstRemote;
import de.htw.ejb.manager.exceptions.EntityManagementDienstException;
import de.htw.ejb.model.Adresse;
import de.htw.ejb.model.Bestellposition;
import de.htw.ejb.model.Bestellung;
import de.htw.ejb.model.Kunde;
import de.htw.ejb.transaktionen.kundenverwaltung.listener.KundenverwaltungLifeCycleMonitor;

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Interceptors( value = { KundenverwaltungLifeCycleMonitor.class } )
public class Kundenverwaltung implements IKundenverwaltung {

	EntityManagementDienstRemote em;
	Properties properties = new Properties();
	
	
	public void initManager(){
		properties.put( Context.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory" );
		properties.put( Context.PROVIDER_URL, "127.0.0.1:1099" );
		InitialContext ctx;
		try{
		ctx = new InitialContext( properties );
		
		em = ( EntityManagementDienstRemote ) ctx
			.lookup( "EntityManagementDienstBean/remote" );
		}catch ( NamingException e1 )
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}

	@Override
	public void erstelleKunde(String name, String vorname, int kundennummer,
			Adresse adresse) {
		initManager();
		Kunde neu = new Kunde();
		neu.setName(name);
		neu.setVorname(vorname);
		neu.setKundennummer(kundennummer);
		neu.setAdresse(adresse);
		try {
		
			em.speichern(neu);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// TODO Auto-generated method stub

	}
	
	@Override
	public void erstelleKunde(Kunde neuerKunde){
		initManager();
		 try {
				
				em.speichern(neuerKunde);
			} catch (EntityManagementDienstException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}

	@Override
	public void loescheKunde(String name) {
		initManager();
		Kunde alt = sucheKunde(name);
		try {
			em.loescheKunde(alt.getKundennummer());
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub

	}

	@Override
	public void loescheKunde(int id) {
		initManager();
		try {
			em.loescheKunde(id);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// TODO Auto-generated method stub

	}

	@Override
	public Kunde sucheKunde(String name) {
		initManager();
		Kunde suchkunde = null;
		try {
			suchkunde = (Kunde) em.sucheKundePerName(name);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return suchkunde;
	}

	@Override
	public Kunde sucheKunde(int id) {
		initManager();
		Kunde suchkunde = null;
		try {
			suchkunde = (Kunde) em.sucheKundePerKundennummer(id);
		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return suchkunde;
	}

	@Override
	public double umsatzermittelnkomplett(String name) {
		initManager();
		Kunde kunden;
		double umsatz = 0;

		try {
			kunden = (Kunde) em.sucheKundePerName(name);

			List<Bestellung> bestellungen = (List<Bestellung>) kunden
					.getBestellungen();

			for (int index = 0; index < bestellungen.size(); index++) {
				List<Bestellposition> bestellpos = (List<Bestellposition>) bestellungen
						.get(index).getPositionen();
				for (int i = 0; i < bestellpos.size(); i++) {
					umsatz += bestellpos.get(i).getArtikel().getPreis()
							* bestellpos.get(i).getAnzahl();
				}

			}

		} catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// TODO Auto-generated method stub
		return umsatz;
	}

	@Override
	public double umsatzermittelnzeitraum(String name, Date datum) {
		initManager();
		Kunde kunden;
		double umsatz=0;
		
		try {
			kunden = (Kunde) em.sucheKundePerName(name);
			
			List<Bestellung>bestellungen=(List<Bestellung>) kunden.getBestellungen();
			
			
			int index = 0;
			while (bestellungen.get(index).getLieferdatum().compareTo(datum) >= 0) {
				List<Bestellposition> bestellpos = (List<Bestellposition>) bestellungen
						.get(index).getPositionen();
				for (int i = 0; i < bestellpos.size(); i++) {
						umsatz += bestellpos.get(i).getArtikel().getPreis()
								* bestellpos.get(i).getAnzahl();
					}

				}
		}catch (EntityManagementDienstException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return umsatz;
	}
}
